perm filename PR5[2,DBL] blob
sn#011039 filedate 1972-12-17 generic text, type T, neo UTF8
00100 BEGIN
00200 EXPR GETVARS(E);
00300 ORDER(OUTNIL(FLATTEN(E)));
00400 EXPR OUTNIL(L);
00500 BEGIN NEW M;
00600 FOR NEW I IN L DO
00700 BEGIN
00800 IF I = 'C THEN I←'CC; IF I='D THEN I←'DD;
00900 IF NOT(MEMBER(I,'(NIL PLUS MINUS TIMES EXPT))
01000 OR MEMBER(I,M) OR NUMBERP(I)) THEN M← I CONS M; RETURN M; END;
01100 RETURN M; END;
01200 EXPR NVARS(E); LENGTH(GETVARS (E));
01300 EXPR DEL1(I,AA);
01400 FOR NEW J IN CDR(AA) COLLECT <(J↑(I-1)) @ (SUFLIST (J,I))>;
01500 EXPR PMATRIX(AA);
01600 FOR NEW I IN A DO BEGIN PRINT I; END;
01700 EXPR GENARGS(NV,LP);
01800 FOR NEW D←1 TO LP COLLECT
01900 <FOR NEW V←1 TO NV COLLECT <REMAINDER ((EXPT(V,D) -
02000 V*D -V - D - 23),
02100 17)- 9>>;
02200 EXPR GENTARG(NV,DEG);
02300 FOR NEW V←1 TO NV COLLECT <V*(5-DEG*4)>;
02400 EXPR GENMATRIX(DEG,INPUT,VARS,LP);
02500 BEGIN NEW G,AA,BB,ZZ,NV;
02600 NV←LENGTH(VARS);
02700 ZZ ← ZV(NV,INPUT,VARS);
02800 G←GENARGS(NV,LP-1 );
02900 FOR NEW I←1 TO LP-1 DO BEGIN
03000 FOR NEW J←1 TO NV DO SET(VARS[J],G[I,J]);
03100 AA[I]←(POLY(DEG,NV,VARS) ↑ (LP-1));
03200 BB[I]←( EVAL(INPUT))-ZZ; END;
03300 RETURN (AA CONS BB CONS ZZ); END;
03400 EXPR GETCO(DEG,INPUT,VARS,LP);
03500 BEGIN NEW G,AA,BB;
03600 G←GENMATRIX(DEG,INPUT,VARS,LP);
03700 AA←G[1]; BB←G[2]; ZZ←CDDR(G);
03800 RETURN ( SOLVE(AA,BB) @ <ZZ>) ; END;
03900 EXPR TESTCO(C,VARS,DEG,INPUT,LP);
04000 BEGIN NEW G,NV;
04100 NV←LENGTH(VARS);
04200 G←GENTARG(NV, LP);
04300 FOR NEW I←1 TO NV DO SET(VARS[I],G[I]);
04400 IF EVAL('PLUS CONS (C * ⊗ POLY(DEG,NV,VARS)))
04500 = EVAL(INPUT) THEN RETURN T ELSE RETURN NIL; END;
04600 EXPR TRY(DEG,VARS,INPUT);
04700 BEGIN NEW C;
04800 LP← LPOLY(DEG, LENGTH(VARS));
04900 IF DEG=0 THEN C←<ZV(LENGTH(VARS),INPUT,VARS)> ELSE
05000 C← GETCO(DEG,INPUT,VARS,LP);
05100 IF TESTCO(C,VARS,DEG,INPUT,LP) OR DEG=4 THEN RETURN (C CONS DEG)
05200 ELSE RETURN TRY(DEG+1,VARS,INPUT); END;
05300 EXPR SF(E);
05400 BEGIN NEW VARS,R,C,DEG;
05500 VARS←GETVARS(E);
05600 E←ALTER(E);
05700 R← TRY(0,VARS,E);
05800 C←R[1];
05900 DEG← CDR(R);
06000 TERPRI(NIL);TERPRI(NIL);PRINTSTR '"DEGREE ";
06100 PRINT DEG; PRINTSTR '"MY STANDARD FORM IS"; PRINT C;
06200 PRINTSTR '"YOUR STANDARD FORM IS";
06300 SFPRINT(VARS,DEG,C); TERPRI(NIL); E END;
06400 EXPR FLATTEN(S);
06500 IF ATOM(S) THEN <S>
06600 ELSE FLATTEN(CAR(S)) @ FLATTEN(CDR (S));
06700 EXPR ORDER(L);
06800 BEGIN FOR NEW KOUNTR←1 TO LENGTH(L) DO
06900 FOR NEW J←1 TO LENGTH(L)-1 DO
07000 FOR NEW I←J TO LENGTH(L)-1 DO
07100 IF ORDERP(L[I+1],L[I]) THEN BEGIN NEW TEMP;
07200 TEMP←L[I]; L[I]←L[I+1]; L[I+1]←TEMP;
07300 RETURN L; END; RETURN L; END;
07400
07500 DSKIN(ORDERFILE);
07600 EE ← '(TIMES 20 (PLUS (TIMES 3 B (EXPT A 2)) (EXPT (PLUS A 3) 2)
07700 (MINUS (TIMES 2 B))) A);
07800 FF ← '(PLUS (TIMES 2 A B) (MINUS C) D);
07900 FF2 ← '(PLUS (TIMES 2 A B) (MINUS Q) U);
08000 EXPR ROUND(X);
08100 BEGIN NEW XX;
08200 XX ← FIX(X+00.500);
08300 IF XX ≥ 16 THEN
08400 XX← QUOTIENT(XX,10) * 10;
08500 RETURN XX; END;
08600 EXPR SFPRINT(VARS, DEG, C); BEGIN
08700 PJ←0;
08800 RETURN PRINT(FINDOT2(OUTN(SFP(DEG,C,VARS))));
08900 END;
09000 EXPR SFP(DEG,C,VARS);
09100 BEGIN NEW X;
09200 IF NULL(VARS) OR DEG=0 THEN
09300 PJ←PJ+1 ALSO
09400 IF C[PJ] = 0 THEN RETURN NIL
09500 ELSE RETURN C[PJ];
09600 IF LENGTH(VARS)=1 AND C[PJ+1]=0 THEN
09700 PJ←PJ+1 ALSO RETURN SFP(DEG-1, C,VARS);
09800 FOR NEW I←DEG TO 0 BY -1 DO BEGIN
09900 NEW I2; I2←DEG-I+1;
10000 IF I≥1 THEN X[DEG-I+1]←CAR(VARS) CONS I
10100 ELSE X[I2]←NIL;
10200 IF LENGTH(VARS) ≥ 2 THEN BEGIN NEW L;
10300 L←SFP(DEG-I,C,CDR(VARS));
10400 IF L AND X[I2] THEN X[I2]←X[I2] CONS L
10500 ELSE IF L THEN X[I2]←L
10600 ELSE X[I2]←NIL; END;
10700 IF LENGTH(VARS) = 1 THEN BEGIN
10800 PJ←PJ+1;
10900 IF X[I2] AND C[PJ]≠0 THEN X[I2]←X[I2] CONS C[PJ]
11000 ELSE IF C[PJ]≠0 THEN X[I2]←C[PJ];
11100 END; END;
11200 RETURN OUTN(X); END;
11300 EXPR FINDOT(E); BEGIN NEW L;
11400 L←LENGTH(E);
11500 E[L-1]←E[L-1] CONS E[L];
11600 RETURN E ↑ (L-1);
11700 END;
11800 EXPR OUTN(E);
11900 BEGIN NEW M;
12000 IF ATOM(E) THEN RETURN E;
12100 FOR NEW I IN E DO
12200 IF I AND (ATOM(I) OR NOT(ATOM(CAR(I))))
12300 THEN M← I CONS M;
12400 M← REV(M);
12500 RETURN M;
12600 END;
12700 EXPR FINDOT2(E);
12800 BEGIN NEW L;
12900 L←LENGTH(E);
13000 IF L ≤ 1 THEN RETURN E;
13100 IF SUFLIST(E,L) THEN RETURN FINDOT(E);
13200 E[L]←FINDOT2(E[L]);
13300 RETURN E;
13400 END;
13500 EXPR EXPT(AA,N);
13600 IF N=0 OR AA=1 THEN 1 ELSE IF AA=0 THEN 0
13700 ELSE IF N=1 THEN AA ELSE AA*EXPT(AA,N-1);
13800 EXPR LPOLY(DEG,NV);
13900 IF DEG=0 OR NV=0 THEN 1 ELSE
14000 FOR NEW I←0 TO DEG; PLUS LPOLY(I,NV-1);
14100 EXPR POLY(DEG,NV,VARS);
14200 EREV(POLY2(DEG,NV,VARS));
14300 EXPR POLY2(DEG,NV,VARS);
14400 IF DEG=0 OR NV=0 THEN <1> ELSE
14500 FOR NEW I←0 TO DEG COLLECT
14600 <EXPT(EVAL(CAR(VARS)), DEG-I) * ⊗
14700 POLY(I,NV-1,CDR(VARS))>;
14800 EXPR OUTNIL2(L);
14900 BEGIN NEW M;
15000 IF ATOM(L) THEN RETURN L;
15100 FOR NEW I IN L DO
15200 IF I THEN M←I CONS M; RETURN M; END;
15300 EXPR EREV(L);
15400 IF ATOM(L) THEN L ELSE
15500 FOR NEW I IN L COLLECT IF ATOM(I) THEN <I>
15600 ELSE I;
15700 EXPR REV(L);
15800 IF ATOM(L) OR NULL(CDR(L)) THEN L ELSE
15900 REV(CDR(L)) @ <CAR(L)>;
16000 EXPR ZV(NV,INPUT,VARS);
16100 BEGIN FOR NEW I←1 TO NV DO
16200 SET(VARS[I],0);
16300 RETURN EVAL(INPUT); END;
16400 EXPR COMBOS(L,N);
16500 IF LENGTH(L) ≥ N THEN
16600 IF N=0 THEN NIL ELSE
16700 IF N=1 THEN FOR NEW J IN L COLLECT <<J>> ELSE
16800 BEGIN
16900 NEW COMBINATIONS;
17000 COMBINATIONS←FOR NEW X IN COMBOS(CDR L, N-1)
17100 COLLECT <L[1] CONS X>;
17200 RETURN (COMBINATIONS @ COMBOS(CDR L, N))
17300 END;
17400 EXPR SOLVE(AA,BB);
17500 BEGIN NEW X,FAC,L,N;
17600 L ← LENGTH(AA);
17700 FOR NEW I1←1 TO L DO BEGIN
17800 BB[I1] ← FLOAT(BB[I1]);
17900 FOR NEW I2 ← 1 TO L DO
18000 AA[I1,I2]←FLOAT(AA[I1,I2]);
18100 END;
18200 FOR NEW I←1 TO L DO BEGIN
18300 FOR NEW J←1 TO L DO
18400 N←J UNTIL ABS(AA[I,J])≥ 0.000110;
18500 IF N=L AND AA[I,L]=0 THEN
18600 RETURN NIL;
18700 FAC ← AA[I,N];
18800 FOR NEW I3←1 TO L DO
18900 AA[I,I3] ← AA[I,I3] / FAC;
19000 BB[I] ← BB[I] / FAC;
19100 FOR NEW K←1 TO L DO IF K ≠ I THEN BEGIN
19200 FAC ← AA[K,N];
19300 FOR NEW M←1 TO L DO
19400 AA[K,M]←AA[K,M] - AA[I,M]*FAC;
19500 BB[K]←BB[K]-BB[I]*FAC;
19600 END; END;
19700 FOR NEW M3←1 TO L DO X[M3]←0;
19800 FOR NEW KK←1 TO L DO
19900 FOR NEW MM←1 TO L DO
20000 IF AA[KK,MM] ≠ 0 THEN X[MM]←ROUND(BB[KK]/AA[KK,MM]);
20100 RETURN X
20200 END;
20300 EXPR FLOAT(X); X+0.00;
20400 EXPR CDREPLACE(E);
20500 FOR NEW I IN E COLLECT
20600 IF I='C OR I='D THEN <I,I>
20700 ELSE <I>;
20800 END.